//go:build build
// +build build

package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
	"path/filepath"
)

type BuildTarget struct {
	OS   string
	Arch string
	Ext  string
}

func main() {
	// 项目名称
	projectName := "go-admin-system"

	// 构建目标
	targets := []BuildTarget{
		{"windows", "amd64", ".exe"},
		{"linux", "amd64", ""},
		{"darwin", "amd64", ""},
	}

	// 创建构建目录
	buildDir := "build"
	if err := os.MkdirAll(buildDir, 0755); err != nil {
		log.Fatal("创建构建目录失败:", err)
	}

	// 获取依赖
	fmt.Println("获取项目依赖...")
	cmd := exec.Command("go", "mod", "tidy")
	if output, err := cmd.CombinedOutput(); err != nil {
		fmt.Printf("获取依赖失败，输出信息:\n%s\n", string(output))
		log.Fatal("获取依赖失败:", err)
	}

	successCount := 0
	// 构建各个平台版本
	for _, target := range targets {
		fmt.Printf("构建 %s/%s 版本...\n", target.OS, target.Arch)

		// 构建命令
		outputName := filepath.Join(buildDir, projectName+"-"+target.OS+"-"+target.Arch+target.Ext)
		cmd := exec.Command("go", "build", "-o", outputName, "-ldflags", "-s -w")

		// 设置环境变量
		cmd.Env = append(os.Environ(),
			"CGO_ENABLED=0", // 禁用 CGO 以避免跨平台构建问题
			fmt.Sprintf("GOOS=%s", target.OS),
			fmt.Sprintf("GOARCH=%s", target.Arch))

		// 捕获输出和错误
		if output, err := cmd.CombinedOutput(); err != nil {
			fmt.Printf("构建 %s/%s 版本失败，详细错误信息:\n%s\n", target.OS, target.Arch, string(output))
			fmt.Printf("✗ %s/%s 版本构建失败\n", target.OS, target.Arch)
			continue
		}

		fmt.Printf("✓ %s/%s 版本构建完成: %s\n", target.OS, target.Arch, outputName)
		successCount++
	}

	// 复制配置文件
	fmt.Println("复制配置文件...")
	configSrc := "config"
	configDst := filepath.Join(buildDir, "config")
	if err := copyDir(configSrc, configDst); err != nil {
		log.Printf("复制配置文件警告: %v", err)
	} else {
		fmt.Println("✓ 配置文件复制完成")
	}

	fmt.Println("\n==================== 构建完成 ====================")
	fmt.Printf("构建目录: %s\n", buildDir)
	fmt.Printf("成功构建: %d/%d 个平台\n", successCount, len(targets))

	for _, target := range targets {
		outputName := projectName + "-" + target.OS + "-" + target.Arch + target.Ext
		fmt.Printf("%s: %s/%s\n", target.OS, buildDir, outputName)
	}
	fmt.Println("==================================================")
}

// copyDir 复制目录
func copyDir(src, dst string) error {
	// 确保目标目录存在
	if err := os.MkdirAll(dst, 0755); err != nil {
		return err
	}

	// 读取源目录
	entries, err := os.ReadDir(src)
	if err != nil {
		return err
	}

	// 复制每个条目
	for _, entry := range entries {
		srcPath := filepath.Join(src, entry.Name())
		dstPath := filepath.Join(dst, entry.Name())

		if entry.IsDir() {
			// 递归复制子目录
			if err := copyDir(srcPath, dstPath); err != nil {
				return err
			}
		} else {
			// 复制文件
			if err := copyFile(srcPath, dstPath); err != nil {
				return err
			}
		}
	}

	return nil
}

// copyFile 复制文件
func copyFile(src, dst string) error {
	data, err := os.ReadFile(src)
	if err != nil {
		return err
	}
	return os.WriteFile(dst, data, 0644)
}
